home *** CD-ROM | disk | FTP | other *** search
/ ASME's Mechanical Engine…ing Toolkit 1997 December / ASME's Mechanical Engineering Toolkit 1997 December.iso / c_lang / varinc.lzh / FPROMPT.C < prev    next >
Text File  |  1979-11-30  |  3KB  |  75 lines

  1. /* SOURCE FILE: FPROMPT.C */
  2. /*****************************************************************************/
  3. /* fprompt() inputs a double-precision floating-point number from standard   */
  4. /*   input. It behaves the same as nprompt(), except that the arguments      */
  5. /*   width and precision must be passed to fprompt() to indicate the width   */
  6. /*   of the field and the number of digits to prompt for on the right of the */
  7. /*   decimal point.                                                          */
  8. /*****************************************************************************/
  9.  
  10. #include <stdio.h>
  11. #include <stddefs.h>
  12. #include "projutil.h"
  13.  
  14. stepcode fprompt(d_num, match_str, min_dval, max_dval, 
  15.    width, precision, mand, row, col)
  16. double *d_num;                    /* Default passed in, input data returned. */
  17. char match_str[];
  18. double min_dval, max_dval;               /* minimum and maximum input values */
  19. short width, precision;                    /* field width and decimal places */
  20. flag mand;                         /* If yes, data cannot be zero on return. */
  21. short row, col;                            /* cursor location to begin input */
  22.  
  23.    {
  24.    short dec, sign;                     /* dummy arguments to pass to fcvt() */
  25.    double atof(char[]);      /* Library function atof() returns type double. */
  26.    char buf[14], format[14];        /* prompt input buffer and format string */
  27.    bflag more = YES; 
  28.    double in_dnum;                 /* ASCII input number converted to double */
  29.    short max_len = width;
  30.    short min_len = strlen(fcvt(min_dval, precision, &dec, &sign)) - precision;
  31.    stepcode rtn;
  32.  
  33.    /* Supply as default if d_num points to a non-zero double. */
  34.    if (*d_num != 0.0)                           /* Non-zero value passed in? */
  35.       {
  36.       ftput(row, col, *d_num, precision, buf, max_len);  /* Display default. */
  37.       }
  38.    else                                                        /* no default */
  39.       buf[0] = '\0';
  40.    do
  41.       {
  42.       rtn = prompt(buf, match_str, min_len, max_len, mand, row, col); 
  43.       if (rtn != STEPOK)
  44.          more = NO;
  45.       else
  46.          {
  47.          in_dnum = atof(buf);                    /* Convert ASCII to double. */
  48.          if (mand && in_dnum == 0.0)
  49.             err_warn("Non-zero data mandatory:", "");
  50.          else if ((in_dnum < min_dval || in_dnum > max_dval) &&
  51.             (mand || in_dnum != 0.0))
  52.             {
  53.  
  54.             /* Create string to pass to err_warn(). */
  55.             sprintf(buf, "%.*f to %.*f", precision, min_dval, 
  56.                precision, max_dval);
  57.             err_warn("Enter a number from:", buf);
  58.             buf[0] = '\0';
  59.             CUR_MV(row, col);
  60.             }
  61.          else
  62.             more = NO;
  63.          }
  64.       }
  65.    while (more);   
  66.  
  67.    if (rtn == STEPOK)                         /* Then echo, right justified. */
  68.       {
  69.       *d_num = in_dnum;                        /* Pass value back to caller. */
  70.       ftput(row, col, *d_num, precision, buf, max_len);
  71.       }
  72.    return (rtn);
  73.    }  
  74.  
  75.